package com.redstar.interesting.common.starter.redis;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;

public interface RedisService {

    /**
     * 在 key 存在时删除 key
     */
    void delete(String key);

    /**
     * 删除多个key
     */
    void delete(Collection keys);

    /**
     * 获取指定 key 的值（强转为int）
     */
    int getInt(String key);

    /**
     * 设置指定 key 的值（int）
     */
    void setInt(String key, int value);

    /**
     * 设置指定 key 的值（int）,并设置缓存时长
     */
    void setInt(String key, int value, long seconds);

    /**
     * 设置指定key的值，并返回旧值
     */
    int getAndSet(String key, int value);

    /**
     * 检查给定 key 是否存在
     */
    boolean exists(String key);

    /**
     * 将 key 中储存的数字值增一
     */
    Long incr(String key);

    /**
     * 将 key 中储存的数字值减一
     */
    Long decr(String key);

    /**
     * 只有在 key 不存在时设置 key 的值
     */
    Boolean setnx(String key, String value);

    /**
     * 只有在 key 不存在时设置 key 的值,同时设置过期时间
     *
     * @param expire 过期时间 seconds
     */
    Boolean setnx(String key, String value, long expire);


    /**
     * 只有在 key 不存在时设置 key 的值,同时设置过期时间 单位毫秒
     *
     * @param key
     * @param value
     * @param expire
     * @return
     */
    Boolean setnxUseMilliseconds(String key, String value, long expire);

    /**
     * 设置给定key生存时间
     */
    void expire(String key, long seconds);

    /**
     * 将给定key的到期时间设置为日期时间戳
     */
    void expireAt(String key, Date date);

    /**
     * 获取过期时间
     */
    long getExpire(String key);

    /**
     * 获得缓存的对象
     */
    <T> T getObject(String key, Class<T> cls);

    /**
     * 缓存对象
     */
    void setObject(String key, Object value);

    /**
     * 缓存对象，支持缓存时长
     */
    void setObject(String key, Object value, Long seconds);


    /**
     * 缓存字符串
     */
    void setString(String key, String value);

    /**
     * 缓存字符串，支持缓存时长
     */
    void setString(String key, String value, Long seconds);

    /**
     * 获得字符串缓存
     */
    String getString(String key);



    /*--------------哈希(Hash) 接口开始----------------*/

    /**
     * 获取在哈希表中指定 key 的所有字段和值
     */
    Map<String, String> hGetAll(String key);

    /**
     * 获取这个hash key下所有字段
     *
     * @param key
     * @return
     */
    @Deprecated
    List<String> hKeys(String key);

    /**
     * 获取存储在哈希表中指定字段的值。
     */
    String hGet(String key, String hashKey);

    /**
     * 获取存储在哈希表中指定字段的值。
     */
    <T> T hGet(String key, Object hashKey, Class<T> clazz);

    /**
     * 将哈希表 key 中的字段 field 的值设为 value 。
     */
    void hSet(String key, String hashKey, String hashValue);

    /**
     * 将哈希表 key 中的字段 field 的值设为 value 。 批量设置
     */
    void hSet(String key, Map<String, List<Serializable>> hash);

    /**
     * 将哈希表 key 中的字段 field 的值设为 value 。
     */
    void hSet(String key, Object hashKey, Serializable hashValue);

    /**
     * 获取所有给定字段的值
     */
    <T> List<T> hMGet(String key, Collection<Object> hashKeys, Class<T> clazz);

    /**
     * 为哈希表 key 中的指定字段的整数值加上增量 increment 。
     */
    long hIncrBy(String key, String field, long value);

    /**
     * 删除一个哈希表字段
     */
    void hDel(String key, String field);

    /**
     * 查看哈希表 key 中，指定的字段是否存在
     */
    boolean hExists(String key, String field);

    /**
     * 获取在哈希表中指定 key 的所有字段和值
     */
    <T> Map<String, T> hGetAll(String key, Class<T> clazz);
    /*--------------哈希(Hash) 接口结束----------------*/


}
